package org.example.system.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.example.system.common.result.Result;
import org.example.system.model.dto.CaptchaResult;
import org.example.system.model.dto.LoginResult;
import org.example.system.service.AuthService;
import org.springframework.web.bind.annotation.*;

/**
 * 认证中心控制器，处理认证相关的请求
 * 包括登录、注销和获取验证码
 *
 * @author liuyang
 */
@Tag(name = "01.认证中心")
@RestController
@RequestMapping("/api/v1/auth")
@RequiredArgsConstructor
@Slf4j
public class AuthController {

    // 注入认证服务，用于处理具体的认证逻辑
    private final AuthService authService;

    /**
     * 登录接口
     * 接收用户名和密码，返回登录结果
     *
     * @param username 用户名
     * @param password 密码
     * @return 包含登录结果的响应对象
     */
    @Operation(summary = "登录")
    @PostMapping("/login")
    public Result<LoginResult> login(
            @Parameter(description = "用户名", example = "admin") @RequestParam String username,
            @Parameter(description = "密码", example = "123456") @RequestParam String password
    ) {
        // 调用认证服务的登录方法进行身份验证
        LoginResult loginResult = authService.login(username, password);
        // 返回封装好的成功响应，包含登录结果
        return Result.success(loginResult);
    }

    /**
     * 注销接口
     * 处理用户注销请求，清除用户会话信息
     *
     * @return 注销成功的响应对象
     */
    @Operation(summary = "注销")
    @DeleteMapping("/logout")
    public Result logout() {
        // 调用认证服务的注销方法清除用户认证信息
        authService.logout();
        // 返回成功的响应，不包含具体数据
        return Result.success();
    }

    /**
     * 获取验证码接口
     * 生成并返回验证码图片和验证码值
     *
     * @return 包含验证码信息的响应对象
     */
    @Operation(summary = "获取验证码")
    @GetMapping("/captcha")
    public Result<CaptchaResult> getCaptcha() {
        // 调用认证服务生成验证码
        CaptchaResult captcha = authService.getCaptcha();
        // 返回封装好的成功响应，包含验证码信息
        // 返回验证码结果
        return Result.success(captcha);
    }
}